#include "strutil.h"
#include "core/cbuffer.h"

namespace renderit
{
	namespace strutil
	{
		std::string str_format(const char * format, ...)
		{
			va_list va;
			va_start(va, format);

			return str_format(format, va);
		}

		std::string str_format(const char * format, va_list va)
		{
			core::cbuffer cbuf;

			bool escape = false;
			while (*format) {
				char c = *format++;
				if (!escape) {
					if (c == '%') {
						escape = true;
						continue;;
					}
					cbuf.add(c);
					continue;
				}

				switch (c) {
				case '%':
					cbuf.add(c);
					break;

				case 's':
				{
					const char * p = va_arg(va, char*);
					cbuf.add(p, strlen(p));
					break;
				}

				case 'S':
				{
					break;
				}

				case 'c':
				{
					char c = va_arg(va, char);
					cbuf.add(c);
					break;
				}

				case 'i':
				case 'd':
				{
					int i = va_arg(va, int);
					char buf[20];
					int len = strutil::int_to_str(buf, 20, i);
					if (len < 20) {
						cbuf.add(buf, len);
					}
					break;
				}

				case 'f':
				{
					double d = va_arg(va, double);
					char buf[40];
					int len = strutil::float_to_str(buf, 40, d, 6);
					if (len < 40) {
						cbuf.add(buf, len);
					}
					break;
				}

				default:
					// not escape
					cbuf.add('%');
					cbuf.add(c);
					break;
				}
				escape = false;
			}

			return std::string(cbuf.buf(), cbuf.size());
		}
	}
}